import paramiko
import getpass


def create_remote_symlink(hostname, port, username, password, command):
    """
    远程连接到Linux服务器并执行创建符号链接的命令

    参数:
        hostname: 远程服务器IP地址
        port: SSH端口号(默认22)
        username: 登录用户名
        password: 登录密码
        command: 要执行的命令(如: "ln -s 临时/tessttt/ sb_tessttt")
    """
    try:
        # 创建SSH客户端对象
        ssh = paramiko.SSHClient()

        # 自动添加主机密钥(首次连接时)
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        print(f"正在连接到服务器 {hostname}...")

        # 建立SSH连接
        ssh.connect(hostname, port, username, password)
        print("连接成功!")

        # 执行命令
        print(f"执行命令: {command}")
        stdin, stdout, stderr = ssh.exec_command(command)

        # 读取命令输出
        output = stdout.read().decode('utf-8')
        error = stderr.read().decode('utf-8')

        # 打印结果
        if output:
            print(f"命令输出: {output}")
        if error:
            print(f"错误信息: {error}")
        else:
            print("符号链接创建命令执行完成!")

    except paramiko.AuthenticationException:
        print("认证失败，请检查用户名和密码")
    except paramiko.SSHException as e:
        print(f"SSH连接错误: {e}")
    except Exception as e:
        print(f"发生错误: {e}")
    finally:
        # 确保连接被关闭
        if 'ssh' in locals():
            ssh.close()
            print("连接已关闭")


def main():
    """主函数：获取用户输入并执行远程命令"""
    print("=== Linux远程符号链接创建工具 ===\n")

    # 获取连接参数
    # hostname = input("请输入Linux服务器IP地址: ").strip()
    # port = int(input("请输入SSH端口(默认22，直接回车使用默认值): ") or "22")
    # username = input("请输入用户名: ").strip()
    # password = getpass.getpass("请输入密码: ")

    hostname = "diskstation2"
    port = 22
    username = "admin"
    password = "mjm19831119"

    # 默认命令或自定义命令
    default_command = "ln -s /volume4/8192G_01/临时/tessttt2 /volume4/8192G_01/goodsync2/sb_tessttt2"
    use_default = input(f"使用默认命令 '{default_command}'? (y/n): ").lower()

    if use_default == 'y':
        command = default_command
    else:
        command = input("请输入要执行的命令: ").strip()

    print("\n开始执行...")
    create_remote_symlink(hostname, port, username, password, command)


# 使用密钥认证的版本（可选）
def create_remote_symlink_with_key(hostname, port, username, key_path, command):
    """
    使用SSH密钥认证连接到Linux服务器

    参数:
        key_path: SSH私钥文件路径
    """
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

        # 加载私钥
        private_key = paramiko.RSAKey.from_private_key_file(key_path)

        print(f"使用密钥连接到服务器 {hostname}...")
        ssh.connect(hostname, port, username, pkey=private_key)

        # 执行命令
        stdin, stdout, stderr = ssh.exec_command(command)

        # 处理输出
        output = stdout.read().decode('utf-8')
        error = stderr.read().decode('utf-8')

        if output:
            print(f"命令输出: {output}")
        if error:
            print(f"错误信息: {error}")
        else:
            print("命令执行成功!")

    except Exception as e:
        print(f"错误: {e}")
    finally:
        if 'ssh' in locals():
            ssh.close()


if __name__ == "__main__":
    main()